SM2簽章和驗證簽章比起金鑰交換簡單很多,和加密解密差不多。
首先A的回合(簽章)
A設置M ̅=Z_A∥M
ZA和前面的一樣,就是A的相關資訊。
A計算e=H_v (M ̅)
這裡的H是雜湊可以使用SM3。
A隨機選擇k
A計算(x_1,y_1) =kG
和前面一樣的算法。
A計算r=(e+x_1) mod n
r是用來檢查訊息m有沒有被更改。
A計算s=((1+d_A )^(-1)⋅(k-r⋅d_A)) mod n
s是簽章用的,可以從算式看出用的是自己的私鑰。
A簽章Sign=(r,s),並把訊息、簽章給B
B的回合(驗證)
B收到M,(r',s')
B檢查r^',s^'∈Z_q^* [1,n-1]
在前面的算法,包含解密、金鑰交換很多都是要做這個,但我有些沒有寫出來。
B設置M ̅^'=Z_A∥M'
B計算e'=H_v (M ̅^')
B計算t=(r^'+s') mod n
B計算(x_1^',y_1^' )=s^' G+tP_A
這個算式很特別,但我記得當時我在推的時候是正確的。
B計算R=(e^'+x_1') mod n
把隨機數和訊息綁在一起,如果不是正確的人給的隨機數一定會驗證失敗。
B檢查R=r'
到這就把SM2給都介紹完了。